home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C++ / Applications / TrapsGen 1.0.1 / TrapGen main.cp < prev    next >
Encoding:
Text File  |  1995-07-01  |  4.0 KB  |  185 lines  |  [TEXT/CWIE]

  1. // TrapsGen - generate a C table from <traps.h>.
  2. // Written by Chris K. Thomas.
  3. // Yes, this is awful.  But it only took five minutes to write.
  4.  
  5. #include <LHandleStream.h>
  6. #include <UException.h>
  7. #include <LFile.h>
  8. #include "StFile.h"
  9. #include "DebugNum.h"
  10.  
  11. /* Globals */
  12.     
  13. /* Prototypes */
  14. void Initialize(void);
  15. void InsertTextIntoStream(short inID, LStream &inStream);
  16. long SearchForChar(char inChar, long inStartPos, Ptr inBuffer, long inBufferLen);
  17. void TrapsConvert();
  18.  
  19. void main(void)
  20. {
  21.     Initialize();
  22. }
  23.  
  24. void Initialize(void)
  25. {
  26.     OSErr        error;
  27.     SysEnvRec    theWorld;
  28.  
  29.     error = SysEnvirons(1, &theWorld);
  30.     if (theWorld.hasColorQD == false) {
  31.         SysBeep(50);
  32.         ExitToShell();                    /* If no color QD, we must leave. */
  33.     }
  34.     
  35.     /* Initialize all the needed managers. */
  36.     InitGraf(&qd.thePort);
  37.     InitFonts();
  38.     InitWindows();
  39.     InitMenus();
  40.     TEInit();
  41.     InitDialogs(nil);
  42.     InitCursor();
  43.     
  44.     Try_
  45.     {
  46.         TrapsConvert();
  47.     }
  48.     Catch_(inErr)
  49.     {
  50.         DebugNum(inErr);
  51.     }
  52.     EndCatch_
  53. }
  54.  
  55. char delimiter = '\0';
  56.  
  57. void TrapsConvert()
  58. {
  59.     LHandleStream    outTrapsTable;
  60.     Handle            trapData;
  61.     
  62.     // setup header
  63.     InsertTextIntoStream(128, outTrapsTable);
  64.     InsertTextIntoStream(129, outTrapsTable);
  65.     InsertTextIntoStream(130, outTrapsTable);
  66.     
  67.     FSSpec theTrapsSpec;
  68.     FSMakeFSSpec(0, 0, "\pTraps.h", &theTrapsSpec);
  69.     
  70.     // get data from traps.h
  71.     {
  72.     LFile ourFile(theTrapsSpec);
  73.     
  74.     ourFile.OpenDataFork(fsRdPerm);
  75.     trapData = ourFile.ReadDataFork();
  76.     ourFile.CloseDataFork();
  77.     }
  78.     
  79.     HLockHi(trapData);
  80.     Ptr    trapDataPtr = *trapData;
  81.     long    bufferSize = GetHandleSize(trapData);
  82.     long    pos = 0;
  83.     long    numTraps = 0;
  84.     long    startName, endName, startNum, endNum;    
  85.     Str255    str;
  86.     
  87.     for(;;)
  88.     {
  89.         startName = SearchForChar('_', pos, trapDataPtr, bufferSize);
  90.         if(startName == -1) break;
  91.         pos = startName;
  92.         /*if(trapDataPtr[pos + 1] == '_')
  93.         {
  94.             //ignore preprocessor symbols
  95.             pos+=2;
  96.             continue;
  97.         }*/
  98.         
  99.         endName = SearchForChar('\t', pos, trapDataPtr, bufferSize);
  100.         if(endName == -1) break;
  101.         pos = endName;
  102.         
  103.         startNum = SearchForChar('=', pos, trapDataPtr, bufferSize);
  104.         if(startNum == -1) break;
  105.         startNum++;
  106.         pos = startNum;
  107.         
  108.         delimiter = '\r';
  109.         endNum = SearchForChar(',', pos, trapDataPtr, bufferSize);
  110.         if(endNum == -1)
  111.             endNum = SearchForChar('\r', pos, trapDataPtr, bufferSize);
  112.         
  113.         if(endNum == -1) break;
  114.         pos = endNum;
  115.         
  116.         delimiter = '\0';
  117.         
  118.         InsertTextIntoStream(256, outTrapsTable);
  119.         outTrapsTable.WriteData(&trapDataPtr[startName], endName - startName);
  120.         InsertTextIntoStream(258, outTrapsTable);
  121.         outTrapsTable.WriteData(&trapDataPtr[startNum], endNum - startNum);
  122.         InsertTextIntoStream(257, outTrapsTable);
  123.         
  124.         numTraps += 1;
  125.     }
  126.  
  127.     outTrapsTable.SetMarker(1, streamFrom_End);
  128.     InsertTextIntoStream(131, outTrapsTable);
  129.     
  130.     // append number of traps recorded
  131.     InsertTextIntoStream(300, outTrapsTable);
  132.     
  133. //    NumToString(numTraps, str);
  134. //    DebugStr(str);
  135.     
  136.     outTrapsTable.WriteData(&str[1], str[0]);
  137.     
  138.     InsertTextIntoStream(301, outTrapsTable);
  139.     
  140.     StPutFile    ourPutFile("\pSave Traps table as:", "\pSpankingTraps.cp");
  141.     if(ourPutFile.reply.sfGood)
  142.     {
  143.         LFile        ourFile(ourPutFile.reply.sfFile);
  144.         
  145.         ourFile.CreateNewDataFile('MPCC', 'TEXT');
  146.         ourFile.OpenDataFork(fsWrPerm);
  147.         ourFile.WriteDataFork(*outTrapsTable.GetDataHandle(), GetHandleSize(outTrapsTable.GetDataHandle()));
  148.         ourFile.CloseDataFork();
  149.     }
  150. }
  151.  
  152. long SearchForChar(char inChar, long inStartPos, Ptr inBuffer, long inBufferLen)
  153. {
  154.     for(long i = inStartPos; i < inBufferLen; i++)
  155.     {
  156.         if(inBuffer[i] == inChar)
  157.         {
  158.             return i;
  159.         }
  160.         else if(inBuffer[i] == delimiter)    //optional delimiter
  161.             return -1;
  162.         else if(inBuffer[i] == '#')    //ignore preprocessor symbols
  163.         {
  164.             while(inBuffer[i] != '\r')    //and the lines they're on
  165.             {
  166.                 i++;
  167.             }
  168.         }
  169.     }
  170.     
  171.     return -1;
  172. }
  173.  
  174. void InsertTextIntoStream(short inID, LStream &inStream)
  175. {
  176.     Handle ourResource = GetResource('TEXT', inID);
  177.     
  178.     ThrowIfNULL_(ourResource);
  179.     
  180.     HLockHi(ourResource);
  181.     inStream.WriteData(*ourResource, GetHandleSize(ourResource));
  182.     HUnlock(ourResource);
  183.     
  184.     //purposely don't dispose text - res manager serves as cache mechanism
  185. }